package com.shi.reflection.Demo02;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test {
    /*
        Class类中用于获取构造方法的方法
            Constructor<?>[] getConstructors()                                返回所有公共构造方法对象的数组
            Constructor<?>[] getDeclaredConstructors()                        返回所有构造方法对象的数组
            Constructor<T> getConstructor(Class<?>... parameterTypes)         返回单个公共构造方法对象
            Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回单个构造方法对象


        Constructor类中用于创建对象的方法
            T newInstance(Object... initargs)                                 根据指定的构造方法创建对象
            setAccessible(boolean flag)                                       设置为true,表示取消访问检查
    */

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //1.获取Student字节码对象
        Class<?> clazz = Class.forName("com.shi.reflection.Demo02.Student");

        //2.获取构造方法

        //(1)获取所有公共构造方法
        System.out.println("(1)获取所有公共方法:");
        Constructor[] constructors = clazz.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor);
        }

        //(2)获取所有构造方法
        System.out.println("(2)获取所有构造方法:");
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor<?> constructor : declaredConstructors) {
            System.out.println(constructor);
        }

        //(3)获取单个公共构造方法
        System.out.println("(3)获取单个公共构造方法:");
        Constructor constructor = clazz.getConstructor(String.class);
        System.out.println(constructor);

        //(4)获取单个构造方法
        System.out.println("(4)获取单个构造方法:");
        Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);
        System.out.println(declaredConstructor);

        //获取方法权限修饰符，用数字表示
        System.out.println("获取方法权限修饰符，用数字表示:");
        int modifiers = declaredConstructor.getModifiers();
        System.out.println(modifiers);

        //利用字节码文件对象创建对象
        System.out.println("利用字节码文件对象创建对象:");
        declaredConstructor.setAccessible(true);
        Student zhangsan = (Student) declaredConstructor.newInstance("张三", 18);
        System.out.println(zhangsan);

    }
}
